import requests
from urllib.parse import urljoin


def is_m3u8_playable(m3u8_url, timeout=10, check_ts=False):
    """
    判断 M3U8 流是否可以播放

    :param m3u8_url: m3u8文件的URL地址
    :param timeout: 请求超时时间(秒)
    :param check_ts: 是否检查TS片段的可访问性
    :return: (是否可播放, 错误信息) 元组
    """
    try:
        # 1. 获取m3u8文件内容
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        response = requests.get(m3u8_url, headers=headers, timeout=timeout)
        response.raise_for_status()  # 如果状态码不是200，抛出异常

        # 2. 检查内容是否是m3u8格式
        content = response.text
        if not (content.startswith('#EXTM3U') or '#EXT-X-STREAM-INF' in content):
            return False, "不是有效的M3U8文件"

        # 3. 可选：检查TS片段
        if check_ts:
            ts_urls = []
            for line in content.splitlines():
                line = line.strip()
                if line and not line.startswith('#'):
                    ts_url = urljoin(m3u8_url, line)
                    ts_urls.append(ts_url)

            # 只检查前3个TS片段（避免耗时过长）
            for ts_url in ts_urls[:3]:
                try:
                    ts_response = requests.head(ts_url, headers=headers, timeout=timeout)
                    ts_response.raise_for_status()
                except Exception as e:
                    return False, f"TS片段 {ts_url} 不可访问: {str(e)}"

        return True, "M3U8流可正常播放"

    except requests.exceptions.RequestException as e:
        return False, f"请求失败: {str(e)}"
    except Exception as e:
        return False, f"发生错误: {str(e)}"


# 使用示例
if __name__ == "__main__":
    test_url = "https://v2024.bbffsl.com/20241202/X7Hzvj0M/index.m3u8"  # 替换为你要测试的m3u8地址
    playable, message = is_m3u8_playable(test_url, check_ts=True)

    if playable:
        print("✅ M3U8流可以正常播放")
    else:
        print(f"❌ M3U8流无法播放: {message}")